package com.aura.common.core.utils;

import java.time.Instant;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.temporal.ChronoUnit;

/**
 * 时间戳工具类（基于 UTC）
 */
public class TimestampUtil {

    private static final ZoneId ZONE_UTC = ZoneId.of("UTC");

    /** 获取当前时间戳（秒） */
    public static long getCurrentEpochSeconds() {
        return Instant.now().getEpochSecond();
    }

    /** 获取当前时间戳（毫秒） */
    public static long getCurrentEpochMillis() {
        return Instant.now().toEpochMilli();
    }

    /** 获取指定秒数后的时间戳（秒） */
    public static long getEpochSecondsAfterSeconds(long seconds) {
        return nowUtc().plusSeconds(seconds).toEpochSecond();
    }

    /** 获取指定秒数后的时间戳（毫秒） */
    public static long getEpochMillisAfterSeconds(long seconds) {
        return nowUtc().plusSeconds(seconds).toInstant().toEpochMilli();
    }

    /** 获取指定月数后的时间戳（秒） */
    public static long getEpochSecondsAfterMonths(long months) {
        return nowUtc().plusMonths(months).toEpochSecond();
    }

    /** 获取指定月数后的时间戳（毫秒） */
    public static long getEpochMillisAfterMonths(long months) {
        return nowUtc().plusMonths(months).toInstant().toEpochMilli();
    }

    /** 获取指定年数后的时间戳（秒） */
    public static long getEpochSecondsAfterYears(long years) {
        return nowUtc().plusYears(years).toEpochSecond();
    }

    /** 获取指定年数后的时间戳（毫秒） */
    public static long getEpochMillisAfterYears(long years) {
        return nowUtc().plusYears(years).toInstant().toEpochMilli();
    }

    /** 计算两个时间戳之间的差值（毫秒） */
    public static long calculateDifferenceMillis(long timestamp1, long timestamp2) {
        return ChronoUnit.MILLIS.between(
                Instant.ofEpochMilli(timestamp1),
                Instant.ofEpochMilli(timestamp2)
        );
    }

    /** 计算两个时间戳之间的差值（秒） */
    public static long calculateDifferenceSeconds(long timestamp1, long timestamp2) {
        return ChronoUnit.SECONDS.between(
                Instant.ofEpochSecond(timestamp1),
                Instant.ofEpochSecond(timestamp2)
        );
    }

    /** 获取当前 UTC 时间 */
    private static ZonedDateTime nowUtc() {
        return ZonedDateTime.now(ZONE_UTC);
    }
}
